// superagent.js
var eventproxy = require('eventproxy');//处理nodejs并发的插件
var cheerio = require('cheerio');//类似于jquery库20150504
var superagent = require('superagent');//20150504为了做网页爬虫，引入superagent,http 方面的库，可以发起 get 或 post 请求 (npm install superagent)
var url  = require('url');// url 模块是 Node.js 标准库里面的
var async  = require('async');// 流程控制工具包，提供了直接而强大的异步功能
var mysql = require('mysql');

exports.index = function(req, res){
	//用superagent去抓取https://cnodejs.org/ 的内容　
  superagent.get('https://cnodejs.org/').end(function(err, sres){
  	if ( err ) {
  		return next( err );
  	};
  	//sres.text里面存储着网页的html内容，将它传给cheerio.load之后
  	//就可以得到一个实现了jquery接口的变量，我们习惯性地将它命名为'$
  	//剩下的就是jquery的内容了
  	var $ = cheerio.load(sres.text);
  	var items = [];
  	$('#topic_list .cell').each(function(idx, element){
  		var $element = $(element);
  		items.push({
  			title:$element.find('.topic_title').attr('title'),
  			href:$element.find('.topic_title').attr('href'),
  			timeline:$element.find(".last_active_time").text(),
  			author:$element.find(".user_avatar img").attr('title')
  		});
  	});
  	res.render('superagent_index',{
  		items_data : items
  	});
  })
}

//爬虫抓取文章列表详情页的评论内容
exports.eventurl = function(req, res){
	var cnodeUrl = 'https://cnodejs.org/';
	superagent.get(cnodeUrl)
		.end(function(err, res) {
			if ( err ) {
				return console.error( err );
			};
			var topicUrls = [];
			var $ = cheerio.load(res.text);
			// 获取首页所有的链接
			$("#topic_list .topic_title").each(function(index, element){
				var $element = $(element);
				// $element.attr('href') 本来的样子是 /topic/542acd7d5d28233425538b04
      			// 我们用 url.resolve 来自动推断出完整 url，变成
			    // https://cnodejs.org/topic/542acd7d5d28233425538b04 的形式
      			// 具体请看 http://nodejs.org/api/url.html#url_url_resolve_from_to 的示例
				var href = url.resolve(cnodeUrl, $element.attr('href') );
				topicUrls.push(href);
			});

			// 得到 topicUrls 之后
			// 得到一个 eventproxy 的实例
			var ep = new eventproxy();
			// 命令 ep 重复监听 topicUrls.length 次（在这里也就是 40 次） `topic_html` 事件再行动
			ep.after('topic_html', topicUrls.length, function(topics){
				// topics 是个数组，包含了 40 次 ep.emit('topic_html', pair) 中的那 40 个 pair
				// 开始行动
				topics = topics.map(function(topicPair){
					 // 接下来都是 jquery 的用法了
					var topicUrl = topicPair[0];
					var topicHtml = topicPair[1];
					var $ = cheerio.load( topicHtml );
					return ({
						title: $(".topic_full_title").text().trim(),
						href:topicUrl,
						comment1:$('.reply_content').eq(0).text().trim(),
					});
				});
				console.log( 'final:' );
				console.log( topics );
				// res.send( topic );
			});

			topicUrls.forEach(function(topicUrl){
				superagent.get(topicUrl)
					.end(function(err, res){
						console.log( 'fetch' + topicUrl + 'successful' );
						ep.emit('topic_html', [topicUrl, res.text]);
					})
			})
		})

}

//async不像eventproxy无下限的执行多个并发，
//eventproxy如果用于大于10个并发数有些不合适，大于10个并发数的可以适用async来自定义控制并发数
exports.async = function(req, res){
	var conn = mysql.createConnection({
		host: 'localhost',
		user: 'root',
		password: '',
		database: 'nodejs',
		port:3306
	});

	var sqls = {
		'insertSQL' : 'INSERT INTO user(`username`, `password`) VALUES("baiping20", "baiping201")',
		'selectSQL' : 'SELECT * FROM user limit 10',
		'deleteSQL' : 'DELETE from user where id = 3',
		'updateSQL' : 'UPDATE user  set username="baiping00" WHERE id = 4 '
	};
	var tasks = ['deleteSQL', 'insertSQL', 'selectSQL', 'updateSQL', 'selectSQL'];
	async.eachSeries(tasks, function(item, callback){
		console.log( item + "===>" + sqls[item] );
		conn.query(sqls[item], function(err, res){
			console.log( res );
			callback(err, res);
		});
	},function(err){
		console.log( "err:" + err );
	})
}	